共计 675 个字符,预计需要花费 2 分钟才能阅读完成。
JVM是通过类加载器(ClassLoader
)将Class字节码文件加载进内存的;
有哪些类加载器?
根加载器(
BootStrap
):一般由本地代码实现,主要负责的是JVM基础核心库类装载(如rt.jar
)
扩展加载器 (Extension
):从BootStrap
继承而来,负责加载java.ext.dirs
系统属性指定目录中的类库;
系统加载器(System
):别名应用类加载器,继承自Extension
,应用最为广泛的,负责从环境变量classpath
或者系统属性java.class.path
指定目录中装载类;
用户自定义加载器:默认继承自System
,特殊定制加载需求才会使用;
原理机制
开发编写.java
文件经过编译生成.class
字节码文件,又称类文件,不可执行需要以下几步;
加载
通常是创建一个字节数组读取
.class
文件中数据进入内存,接着就会产生与所加载类对应的Class
对象;
连接
此时的Class对象仍不完整,不可用,需要经过验证、准备(为静态变量分配内存并设置默认的初始值)、解析(将符号引用替换为直接引用)三步;
初始化
当前被加载的类存在直接父类且还未被初始化,先初始化父类(重复此三步:加载、连接、初始化);
如果存在初始化语句,依次执行这些语句(在父类加载的时候也需要做);
什么是父亲委托机制?
开始于JDK 1.2,英文缩写PDM;
JVM自带的BootStrap是根加载器,其他的加载器有且仅有一个父类加载器;
类的加载首先请求父类加载器,父类加载器加载不了时,再由器子类加载器加载;
JVM不会向Java程序开放任何对BootStrap
的接口;